package dataspace

type list struct {
	root element // корневой элемент
	Len  uint    // кол-во элементов
}

// Конструктор создаёт новый двусвязный список.
func newList() *list {
	l := &list{root: element{}, Len: 0}
	l.root.next = &l.root
	l.root.prev = &l.root
	return l
}

// Метод добавляет новый элемент списка.
func (l *list) push(v uint64) *element {
	e := &element{
		list:  l,
		next:  l.root.prev.next,
		prev:  l.root.prev,
		value: v,
	}
	e.prev.next = e
	e.next.prev = e
	l.Len++
	return e
}

// Метод удаляет элемент списка.
func (l *list) remove(e *element) {
	e.prev.next = e.next
	e.next.prev = e.prev
	e.next = nil
	e.prev = nil
	e.list = nil
	l.Len--
}

// Метод переходит на след. элемент списка.
func (l *list) front() *element {
	if l.Len == 0 {
		return nil
	}
	return l.root.next
}

// Метод переходит на пред. элемент списка.
func (l *list) back() *element {
	if l.Len == 0 {
		return nil
	}
	return l.root.prev
}
